package model;

// 导入ArrayList和List类，用于创建和管理课程列表
import java.util.ArrayList;
import java.util.List;

/**
 * 教师类
 * 继承自Person类，添加授课相关功能
 * 这是Person抽象基类的具体子类，实现了抽象方法printWorksheet()
 */
public class Teacher extends Person {
    // 私有属性：存储教师所教授的课程列表
    private List<Course> taughtCourses; // 所授课程列表
    
    /**
     * 构造方法
     * @param id 教师编号
     * @param name 教师姓名
     * @param gender 教师性别
     * 使用super()调用父类Person的构造方法来初始化人员基本信息
     * 同时初始化所授课程列表为空的ArrayList
     */
    public Teacher(String id, String name, String gender) {
        // 调用父类的构造方法，传入教师的基本信息
        super(id, name, gender);
        // 初始化课程列表，准备存储教师教授的课程
        taughtCourses = new ArrayList<>();
    }
    
    /**
     * 授课方法 - 教师添加一门要教授的课程
     * @param course 要教授的课程对象
     * 1. 首先检查教师是否已经教授这门课
     * 2. 如果没有教授过，将课程添加到教师的课程列表中
     * 3. 同时将该教师设置为课程的授课教师
     * 4. 根据结果输出相应的提示信息
     */
    public void teachCourse(Course course) {
        // 步骤1：检查教师是否已经教授这门课程
        if (!taughtCourses.contains(course)) {
            // 步骤2：将课程添加到教师的课程列表
            taughtCourses.add(course);
            // 步骤3：设置课程的授课教师为当前教师
            course.setTeacher(this);
            // 输出添加成功的提示信息
            System.out.printf("教师信息：编号=%s，姓名=%s，性别=%s，成功添加所授课程：%s%n",
                    getId(), getName(), getGender(), course.getName());
        } else {
            // 如果教师已经教授这门课，输出相应提示
            System.out.printf("教师信息：编号=%s，姓名=%s，性别=%s，已经教授课程：%s%n",
                    getId(), getName(), getGender(), course.getName());
        }
    }
    
    /**
     * 重写父类Person中的抽象方法printWorksheet
     * 实现打印教师授课表的功能
     * 1. 打印教师的基本信息（前面加一个换行符，使输出更清晰）
     * 2. 检查教师是否有教授的课程
     * 3. 如果有，遍历所有课程并打印课程详情
     */
    @Override // 注解表示这是重写父类的方法
    public void printWorksheet() {
        // 步骤1：打印教师基本信息（前面加换行符）
        System.out.printf("\n教师信息：编号=%s，姓名=%s，性别=%s%n",
                getId(), getName(), getGender());
        
        // 步骤2：检查教师是否有教授的课程
        if (taughtCourses.isEmpty()) {
            // 如果没有课程，输出相应提示
            System.out.println("该教师目前未教授任何课程");
        } else {
            // 如果有课程，输出课程列表标题
            System.out.println("所授课程列表：");
            // 步骤3：遍历所有教授的课程并打印详细信息
            for (Course course : taughtCourses) {
                System.out.printf("  课程编号：%s，课程名称：%s，地点：%s%n",
                        course.getId(), course.getName(), course.getLocation());
            }
        }
    }
    
    /**
     * 获取教师所教授的课程列表
     * @return 教师所教授课程的List集合
     * 这是一个getter方法，提供对私有属性的只读访问
     */
    public List<Course> getTaughtCourses() {
        return taughtCourses;
    }
}
